

#include <stdio.h>

//#include <assert.h>
//#include <stdlib.h>
//int _BinarySearch(int* com, int tar, int sz)
//{
//    int left = 0, right = sz - 1;
//
//    while (left <= right)
//    {
//        int mid = ((right - left) >> 1) + left;
//        //printf("[left %d:right %d:mid %d]", left, right, mid);
//        if (tar < com[mid])
//            right = mid - 1;
//        else if (tar > com[mid])
//            left = mid + 1;
//        else
//            return mid;
//    }
//
//    return -1;
//}
//
//int search(int* nums, int numsSize, int target)
//{
//    if (1 == numsSize)
//    {
//        if (target == nums[0])
//            return 0;
//        else
//            return -1;
//    }
//    else
//    {
//        int* com = (int*)malloc(numsSize * sizeof(int));
//        assert(com);
//
//        int goal = 0;
//        while (goal < numsSize - 1)
//        {
//            /*if (nums[goal] < nums[goal + 1])
//            {
//                ++goal;
//            }
//            else
//            {
//                ++goal;
//                break;
//            }*/
//            if (nums[goal++] < nums[goal + 1])
//                ;
//            else
//                break;
//        }
//        if (numsSize - 1 == goal)
//        {
//            for (int i = 0; i < numsSize; ++i)
//            {
//                if (target == nums[i])
//                    return i;
//            }
//            return -1;
//        }
//
//        int preNum = goal, aftNum = numsSize - goal;
//        //printf("%d:%d ", preNum, aftNum);
//
//        int j = 0;
//        for (int i = goal; i < numsSize; ++i)
//        {
//            com[j++] = nums[i];
//        }
//        for (int i = 0; i < goal; ++i)
//        {
//            com[j++] = nums[i];
//        }
//
//        // for (int i = 0; i < numsSize; ++i)
//        //     printf("%d ", com[i]);
//        // putchar('\n');
//
//        int ret = _BinarySearch(com, target, numsSize);
//        free(com);
//
//        if (-1 == ret)
//        {
//            return -1;
//        }
//        else
//        {
//            if (target < nums[0])
//                return ret + preNum;
//            else
//                return ret - aftNum;
//        }
//    }
//}
//
//int search2(int* nums, int numsSize, int target)
//{
//    int* com = (int*)malloc(2 * numsSize * sizeof(int));
//    assert(com);
//
//    int j = 0;
//    for (int i = 0; i < numsSize; ++i)
//    {
//        com[j++] = nums[i];
//    }
//    for (int i = 0; i < numsSize; ++i)
//    {
//        com[j++] = nums[i];
//    }
//
//    for (int i = 0; i < 2 * numsSize; ++i)
//    {
//        if (target == com[i])
//        {
//            free(com);
//            return i % numsSize;
//        }
//    }
//    free(com);
//
//    return -1;
//}
//
//int main()
//{
//    int nums[] = { 4,5,6,7,0,1,2 };
//    int numsSize = sizeof(nums) / sizeof(nums[0]);
//    int target = 0;
//
//    int ret = search(nums, numsSize, target);
//    int ret2 = search2(nums, numsSize, target);
//    printf("%d\n", ret);
//    printf("%d\n", ret2);
//
//	return 0;
//}

struct ListNode 
{
    int val;
    struct ListNode* next;
    
};
// v1
// int getDecimalValue(struct ListNode* head) 
// {
//     int cnt = 0;
//     struct ListNode* cur = head;
//     while (cur)
//     {
//         ++cnt;
//         cur = cur->next;
//     }
//
//     cur = head;
//     int sum = 0;
//     while(cur)
//     {
//         //printf("%d:%d\n", cur->val, cnt);
//         sum += cur->val * (int)pow(2, --cnt);
//
//         cur = cur->next;
//     }
//
//     return sum;
// }

// v2
int getDecimalValue(struct ListNode* head)
{
    struct ListNode* cur = head;

    int ans = 0;
    while (cur)
    {
        ans = ans << 1 | cur->val;
        cur = cur->next;
    }

    return ans;
}

int main()
{
    return 0;
}